package adfc2.render3d;

public class Utils {

    private Utils() {
    }

    /**
     * Считает нормаль к плоскости, заданной тремя точками (vertices со смещением vi), и записывает её
     * (nl/3) раз в normal (со смещением ni)
     */
    public static void normal(double[] vertices, int vi, double[] normal, int ni, int nl) {
        double[] v1 = {vertices[3 + vi] - vertices[0 + vi], vertices[4 + vi] - vertices[1 + vi], vertices[5 + vi] - vertices[2 + vi]};
        double[] v2 = {vertices[6 + vi] - vertices[3 + vi], vertices[7 + vi] - vertices[4 + vi], vertices[8 + vi] - vertices[5 + vi]};
        normal[0 + ni] = v1[1] * v2[2] - v1[2] * v2[1];
        normal[1 + ni] = v1[2] * v2[0] - v1[0] * v2[2];
        normal[2 + ni] = v1[0] * v2[1] - v1[1] * v2[0];
        for (int i = 3 + ni; i < ni + nl; i += 3) {
            normal[i + 0] = normal[0 + ni];
            normal[i + 1] = normal[1 + ni];
            normal[i + 2] = normal[2 + ni];
        }
    }
}
